//冰雪覆盖在角色身上‘
//雪特效原理：surface和vert同时
//检测哪些部分三角形 会覆盖积雪，积雪方向小于一定角度
Shader "Part2/surfSnowshader"
{


	Properties
    {
        _MainColr ("_MainColr", Color) = (1,1,1,1)
        _MainTex ("_MainTex", 2D) = "white" {}
        _Bump("_Bump", 2D) = "bump" {}
        _Snow ("级别", Range(1,-1)) =1
        _SnowColor ("雪的颜色", Color) = (1,1,1,1)
        _SnowDirection ("雪的方向", Vector) = (0,1,0,0)
        _SnowDepth ("雪的深度", Range(0,0.0001)) = 0


    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
    // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Lambert //vertex:vert
        //使用的shader模型
        // #include "UnityCG.cginc"

        float4 _MainColr;
        sampler2D _MainTex;
        sampler2D _Bump;
        float _Snow;
        float4 _SnowColor;
        float4 _SnowDirection;
        float _SnowDepth;
//增加雪的形变
        void vert(inout appdata_full v)
        {
            _SnowDirection = normalize(_SnowDirection); // 归一化方向向量
            _SnowDirection.w = 0; // 去除方向向量的第四个分量
            //雪的方向在世界空间，人的三角形再局部空间，所以要转换,乘矩阵即可
            float snow = mul(unity_WorldToObject, _SnowDirection);//unity_WorldToObject，unity 5.5叫这个
            float f = dot(v.normal, sn.xyz);
            if(f>=_Snow){
                // v.vertex.xyz += snow.xyz  * _SnowDepth; // 增加雪的深度，顶点上移动
                v.vertex.xyz += normalize(snow.xyz + v.normal)* _SnowDepth; // 增加雪的深度，顶点上移动
            }

        }
//unity安装文件，

        //定义一个结构体，包含两个属性，一个是颜色，一个是偏移量
        struct Input
        {
            float2 uv_MainTex;
            float3 uv_Bump;
            float3 worldNormal;
            INTERNAL_DATA
        };
        
        void surf (Input IN, inout SurfaceOutput o)
        {
        	half4 c = tex2D(_MainTex, IN.uv_MainTex); // 采样主纹理
            o.Normal=UnpackNormal(tex2D(_Bump, IN.uv_Bump));// UnpackNormal :函数将法线纹理采样结果转换为法线向量
            // 颜色介于【0，1】，而法线介于【-1，1】，所以需要采用统一方法转化
            // 计算世界空间下的法线 
           float3 worldNormal = WorldNormalVector(IN, o.Normal);
            // 计算法线和方向的点积, 得到一个标量值， 表示法线和方向的夹角，如果点积大于0，说明法线和方向同向
            float f = dot(worldNormal, _SnowDirection.xyz);
            // 如果点积小于0，说明法线和方向相反
            if (f >= _Snow)
            {
            	o.Albedo = _SnowColor.rgb;
            }
            else
            {
            	o.Albedo = c.rgb;
            }
        }

        ENDCG
    }
    FallBack "Diffuse"
}